package com.dc.toolkit.json_gson;

import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;
import com.google.gson.annotations.Since;
import com.google.gson.annotations.Until;
import lombok.Data;
import lombok.experimental.Accessors;

import java.util.Date;

@Data
@Accessors(chain = true)
public class Mouse {

	/**
	 * - @SerializedName
	 * 		用于设置别名，默认在字段名相同的字段间解析，但是java对象里的属性名和json里的字段名有时会不一样。Gson提供注解的方法来解决这个问题。
	 * 			value 		–序列化或反序列化时所需的字段名称。
	 * 			alternate	–反序列化时字段的备用名称。除了“值”属性外，它还提供了更多可能的名称。如果有多个字段匹配一个属性，则Gson将使用最后处理的那个。
	 *
	 * - @Expose
	 * 		用于标记对象序列化或反序列化时是否公开（包括活不包括）的字段，在要显式指定应进行序列化或反序列化的所有字段的编程方式中很有用。
	 * 		(默认 序列号或反序列号都为true)，即： @Expose(serialize=true,deserialize=true)
	 * 			serialize 	–如果为true，则在序列化时会在JSON中写出带有此注解的字段。
	 * 			deserialize –如果为true，则从JSON反序列化带有此注解的字段。
	 * 		<1> new Gson() 创建Gson并执行toJson() 和 fromJson() 方法，则@Expose将不会对序列化和反序列化产生任何影响。
	 * 		<2> 要使用此批注，我们必须使用GsonBuilder类及其excludeFieldsWithoutExposeAnnotation()方法创建Gson实例。
	 * 			Gson json_gson = new GsonBuilder()
	 *                	.excludeFieldsWithoutExposeAnnotation()
	 *                	.create();
	 *             属性没有@Expose注解，或者注解的属性值为false时，转换后不展示
	 */
	@SerializedName(value="姓名", alternate={"peopleName","Name","people_name"})
	@Expose
	private String name;

	@Expose(serialize = false, deserialize = false)
	private Integer age;

	private Integer sex;

	/**
	 * 但字段为日期格式，可以通过
	 * 		Gson json_gson = new GsonBuilder()
	 * 			.setDateFormat("yyyy-MM-dd")
	 * 			.create();
	 * 	令日期格式转换生效
	 */
	@Expose	
	private Date birthday;
	
	/**
	 *  - @Since(X) 维护同一对象的多个版本，表示从 X 版本后开始生效
	 *  	Gson json_gson = new GsonBuilder()
	 *  		.setVersion(5.0)
	 *  		.create();
	 */
	@Since(4.0)
	@Expose
	private Integer phone;
	
	/**
	 *  - @Until(X) 表示在 X 版本前生效
	 *  	Gson json_gson = new GsonBuilder()
	 *  		.setVersion(5.0)
	 *  		.create();
	 */
	@Until(3.0)
	@Expose
	private Integer mobile;

}
